package algoritmos;

import java.util.ArrayList;
import java.util.List;

import mapeamento.MapeamentoRelativo;
import options.XQueryOptions;
import parsedquery.Conceito;
import finalquery.For;

public class NavigateInsideFragments {
	
	public static List<For> execute(List<Conceito> query, List<MapeamentoRelativo> mapRelativo) {
		List<For> cFor = new ArrayList<For>();
		Conceito prevCon = query.get(0);
		
		for (int i = 1; i < query.size(); i++) {
			Conceito con = query.get(i);
			StringBuffer expressao = new StringBuffer();
			String baseUri = new String();
			
			if (con.getLcm().equals(prevCon.getLcm())) {
				
				for (int j = 0; j < con.getFontes().size(); j++) {
					String caminho = procuraCaminhoRelativo(prevCon.getConceito(), con.getConceito(), con.getFontes().get(j), mapRelativo);
					if ((con.getFontes().size() > 1) && (XQueryOptions.SHOW_BASE_URI)) {
						baseUri = "[base-uri(.)=\"" + con.getFontes().get(j) + "\"]";
					}
					if (j > 0) {
						expressao.append(" | ");
					}
					expressao.append("($v" + prevCon.getOid() + baseUri + "/" + caminho + ")");
				}
				For clausulaFor = new For("$v" + con.getOid(), expressao.toString());
				cFor.add(clausulaFor);
			}	
			prevCon = con;
		}		
		return cFor;
	}
	
	private static String procuraCaminhoRelativo(String prevConceito, String conceito, String fonte, List<MapeamentoRelativo> mapRelativo) {
		String caminho = null;
		
		for (int i = 0; i < mapRelativo.size(); i++) {
			MapeamentoRelativo map = mapRelativo.get(i);
			if (map.getOrigem().equals(prevConceito) && map.getDestino().equals(conceito)
				&& map.getUrl().equals(fonte)) {
				caminho = map.getExpressao();
			}
		}

		return caminho;
	}

}
